#include <iostream>
using namespace std;

namespace Drinking
{
    class AbstractDrinking
    {
    private:
        /* data */
    public:
        AbstractDrinking(/* args */);
        // 煮水
        virtual void Boil() = 0;
        // 冲泡
        virtual void Brew() = 0;
        // 倒入杯中
        virtual void PourInCup() = 0;
        // 加入辅料
        virtual void PutSometing() = 0;
        // 制作饮品
        void makeDringk()
        {
            Boil();
            Brew();
            PourInCup();
            PutSometing();
        } 
        ~AbstractDrinking();
    };

    AbstractDrinking::AbstractDrinking(/* args */)
    {
    }

    AbstractDrinking::~AbstractDrinking()
    {
    }

    class Coffee : public AbstractDrinking
    {
    private:
        /* data */
    public:
        Coffee(/* args */);
        // 煮水
        virtual void Boil()
        {
            cout << "煮农夫山泉" << endl;
        }
        // 冲泡
        virtual void Brew()
        {
            cout << "冲泡咖啡" << endl;
        }
        // 倒入杯中
        virtual void PourInCup()
        {
            cout << "倒入大肚杯中" << endl;
        }
        // 加入辅料
        virtual void PutSometing()
        {
            cout << "加入糖和牛奶" << endl;
        }
        // 制作饮品
        void makeDringk()
        {
            Boil();
            Brew();
            PourInCup();
            PutSometing();
        } 
        ~Coffee();
    };

    Coffee::Coffee(/* args */)
    {
    }

    Coffee::~Coffee()
    {
    }

    class Tea : public AbstractDrinking
    {
    private:
        /* data */
    public:
        Tea(/* args */);
        // 煮水
        virtual void Boil()
        {
            cout << "煮百岁山" << endl;
        }
        // 冲泡
        virtual void Brew()
        {
            cout << "冲泡茶叶" << endl;
        }
        // 倒入杯中
        virtual void PourInCup()
        {
            cout << "倒入大肚杯中" << endl;
        }
        // 加入辅料
        virtual void PutSometing()
        {
            cout << "加入枸杞" << endl;
        }
        // 制作饮品
        void makeDringk()
        {
            Boil();
            Brew();
            PourInCup();
            PutSometing();
        } 
        ~Tea();
    };

    Tea::Tea(/* args */)
    {
    }

    Tea::~Tea()
    {
    }
} // namespace Drinking


// 制作函数
void duWork(Drinking::AbstractDrinking * abs)
{
    abs->makeDringk();
    delete abs;
}

void test01()
{
    // 制作咖啡
    duWork(new Drinking::Coffee);
    // 制作茶
    duWork(new Drinking::Tea);
}

int main()
{
    test01();
    return 0;
}

